#include<iostream>  
#include<vector>  
using namespace std;  
  
class Graph {  
    int V; // 顶点数量  
    vector<vector<int>> adjMatrix; // 邻接矩阵  
    vector<vector<int>> adjList; // 邻接表  
  
public:  
    Graph(int V); // 构造函数  
    void addEdge(int v, int w); // 添加边  
    void printGraph(); // 打印图  
};
Graph::Graph(int V) {  
    this->V = V;  
    adjMatrix = vector<vector<int>>(V, vector<int>(V, 0)); // 初始化邻接矩阵  
    adjList = vector<vector<int>>(V, vector<int>(0)); // 初始化邻接表  
}  
  
void Graph::addEdge(int v, int w) {  
    adjMatrix[v][w] = 1; // 在邻接矩阵中添加边  
    adjMatrix[w][v] = 1; // 因为是无向图，所以反向也要添加  
    adjList[v].push_back(w); // 在邻接表中添加边  
    adjList[w].push_back(v); // 因为是无向图，所以反向也要添加  
}  
  
void Graph::printGraph() {  
    cout << "Adjacency Matrix: " << endl;  
    for (int i = 0; i < V; i++) {  
        for (int j = 0; j < V; j++) {  
            cout << adjMatrix[i][j] << " ";  
        }  
        cout << endl;  
    }  
    cout << "Adjacency List: " << endl;  
    for (int i = 0; i < V; i++) {  
        for (int j = 0; j < adjList[i].size(); j++) {  
            cout << adjList[i][j] << " ";  
        }  
        cout << endl;  
    }  
}
int main() {  
    Graph g(5); // 创建一个有5个顶点的图  
    g.addEdge(0, 1); // 添加边(0, 1)  
    g.addEdge(0, 4); // 添加边(0, 4)  
    g.addEdge(1, 2); // 添加边(1, 2)  
    g.addEdge(1, 3); // 添加边(1, 3)  
    g.addEdge(1, 4); // 添加边(1, 4)  
    g.addEdge(2, 3); // 添加边(2, 3)  
    g.addEdge(3, 4); // 添加边(3, 4)  
    g.printGraph(); // 打印图  
    return 0;  
}